home *** CD-ROM | disk | FTP | other *** search
- 'File: TEST6.BAS
- 'Descp.: A Mode "X" demonstration
- 'Author: Matt Pritchard
- 'Date: 14 April, 1993
- '
- DECLARE SUB DEMO.RES (Mode%, Xmax%, Ymax%)
- DECLARE SUB ERROR.OUT (Message$)
- DECLARE FUNCTION GET.KEY% ()
- DECLARE SUB LOAD.SHAPES ()
- DECLARE SUB PAGE.DEMO ()
- DECLARE SUB PRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%, ColorB%)
- DECLARE SUB TPRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%)
- DEFINT A-Z
-
-
- TYPE ShapeType
- ImgData AS STRING * 512
- xWidth AS INTEGER
- yWidth AS INTEGER
- END TYPE
-
- TYPE Sprite
- Xpos AS INTEGER
- Ypos AS INTEGER
- XDir AS INTEGER
- YDir AS INTEGER
- Shape AS INTEGER
- END TYPE
-
-
- CONST MaxShapes = 32
-
- REM $INCLUDE: 'UTILS.BI'
- REM $INCLUDE: 'MODEX.BI'
-
- DIM SHARED Img(32) AS ShapeType
- COMMON SHARED Img() AS ShapeType
-
-
- CALL INIT.RANDOM
-
- CALL LOAD.SHAPES
-
- CALL DEMO.RES(Mode320x200, 320, 200)
- CALL DEMO.RES(Mode320x400, 320, 400)
-
- CALL DEMO.RES(Mode360x200, 360, 200)
- CALL DEMO.RES(Mode360x400, 360, 400)
-
- CALL DEMO.RES(Mode320x240, 320, 240)
- CALL DEMO.RES(Mode320x480, 320, 480)
-
- CALL DEMO.RES(Mode360x240, 360, 240)
- CALL DEMO.RES(Mode360x480, 360, 480)
-
- CALL PAGE.DEMO
-
- SET.VIDEO.MODE 3
- DOS.PRINT "THIS MODE X DEMO IS FINISHED"
- END
-
- SUB DEMO.RES (Mode, Xmax, Ymax)
-
- IF SET.MODEX%(Mode) = 0 THEN
- ERROR.OUT "Unable to SET_MODEX" + STR$(Mode)
- END IF
-
- XCenter = Xmax \ 2
-
- X1 = 10
- Y1 = 10
- X2 = Xmax - 1
- Y2 = Ymax - 1
-
- FOR Z = 0 TO 3
- Colr = 31 - Z * 2
- DRAW.LINE X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr
- DRAW.LINE X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr
- DRAW.LINE X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr
- DRAW.LINE X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr
- NEXT Z
-
- XChars = Xmax \ 10
- YChars = Ymax \ 10
-
- FOR X = 0 TO XChars - 1
- TGPRINTC 48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X \ 8) MOD 7)
- DRAW.LINE X * 10 + 9, 0, X * 10 + 9, 3, 15
- NEXT X
-
- FOR Y = 0 TO YChars - 1
- TGPRINTC 48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y \ 10) MOD 7)
- DRAW.LINE 0, Y * 10 + 9, 3, Y * 10 + 9, 15
- NEXT Y
-
- ' Draw Lines
-
- FOR X = 0 TO 63
- N = 15 + X * .75
- SET.DAC.REGISTER 64 + X, N, N, N
- SET.DAC.REGISTER 128 + X, 0, N, N
-
- DRAW.LINE 103 - X, 60, 40 + X, 123, 64 + X
- DRAW.LINE 40, 60 + X, 103, 123 - X, 128 + X
-
- NEXT X
- TPRINT.TEXT "LINE TEST", 37, 130, c.BLUE
-
- Y = 60: Gap = 0
- FOR X = 0 TO 9
- FILL.BLOCK 120, Y, 120 + X, Y + Gap, 64 + X
- FILL.BLOCK 140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X
- FILL.BLOCK 170 - (15 - X), Y, 170, Y + Gap, 128 + X
- Y = Y + Gap + 2
- Gap = Gap + 1
- NEXT X
- TPRINT.TEXT "FILL TEST", 110, 46, c.GREEN
-
-
- FOR X = 190 TO 250 STEP 2
- FOR Y = 60 TO 122 STEP 2
- SET.POINT X, Y, X + Y + X + Y
- NEXT Y
- NEXT X
-
- TPRINT.TEXT "PIXEL TEST", 182, 130, c.RED
-
- FOR X = 190 TO 250 STEP 2
- FOR Y = 60 TO 122 STEP 2
- IF READ.POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN
- ERROR.OUT "READ.PIXEL Failure"
- END IF
- NEXT Y
- NEXT X
-
-
-
- Msg$ = " This is a MODE X demo "
- PRINT.TEXT Msg$, XCenter - (LEN(Msg$) * 4), 20, c.bRED, c.BLUE
- Msg$ = "Screen Resolution is by "
- Xp = XCenter - (LEN(Msg$) * 4)
- PRINT.TEXT Msg$, Xp, 30, c.bGREEN, c.BLACK
-
- PRINT.TEXT LTRIM$(STR$(Xmax)), Xp + 8 * 21, 30, c.bPURPLE, c.BLACK
- PRINT.TEXT LTRIM$(STR$(Ymax)), Xp + 8 * 28, 30, c.bWHITE, c.BLACK
-
- FOR X = 0 TO 15
- SET.DAC.REGISTER 230 + X, 63 - X * 4, 0, 15 + X * 3
- DRAW.LINE 30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X
- NEXT X
- TPRINT.TEXT "Press <ANY KEY> to Continue", XCenter - (26 * 4), Ymax - 18, c.YELLOW
-
- X = GET.KEY%
- IF X = KyESC THEN ERROR.OUT "ABORT"
-
- END SUB
-
- SUB ERROR.OUT (Message$)
-
- SET.VIDEO.MODE 3
- DOS.PRINT Message$
- END
-
- END SUB
-
- FUNCTION GET.KEY%
-
- DO
- X = SCAN.KEYBOARD
- LOOP UNTIL X
-
- GET.KEY% = X
-
- END FUNCTION
-
- SUB LOAD.SHAPES
-
- DIM Grid(1 TO 32, 1 TO 32)
-
- FOR Shape = 0 TO MaxShapes - 1
-
- FOR Y = 1 TO 32
- FOR X = 1 TO 32
- Grid(X, Y) = 0
- NEXT X
- NEXT Y
-
- Style = RANDOM.INT(6)
- Colour = 1 + RANDOM.INT(15)
-
- SELECT CASE Style
-
- CASE 0: ' Solid Box
-
- DO
- xWidth = 3 + RANDOM.INT(30)
- yWidth = 3 + RANDOM.INT(30)
- LOOP UNTIL ((xWidth * yWidth) <= 512)
-
- FOR Y = 1 TO yWidth
- FOR X = 1 TO xWidth
- Grid(X, Y) = Colour
- NEXT X
- NEXT Y
-
- CASE 1: ' Hollow Box
-
- DO
- xWidth = 5 + RANDOM.INT(28)
- yWidth = 5 + RANDOM.INT(28)
- LOOP UNTIL ((xWidth * yWidth) <= 512)
-
- FOR Y = 1 TO yWidth
- FOR X = 1 TO xWidth
- Grid(X, Y) = Colour
- NEXT X
- NEXT Y
-
- HollowX = 1 + RANDOM.INT(xWidth \ 2 - 1)
- HollowY = 1 + RANDOM.INT(yWidth \ 2 - 1)
-
- FOR Y = HollowY + 1 TO yWidth - HollowY
- FOR X = HollowX + 1 TO xWidth - HollowX
- Grid(X, Y) = nil
- NEXT X
- NEXT Y
-
- CASE 2: ' Solid Diamond
-
- xWidth = 3 + 2 * RANDOM.INT(10)
- yWidth = xWidth
- Centre = xWidth \ 2
-
- FOR Y = 0 TO Centre
- FOR X = 0 TO Y
- Grid(Centre - X + 1, Y + 1) = Colour
- Grid(Centre + X + 1, Y + 1) = Colour
- Grid(Centre - X + 1, yWidth - Y) = Colour
- Grid(Centre + X + 1, yWidth - Y) = Colour
- NEXT X
- NEXT Y
-
-
- CASE 3: ' Hollow Diamond
-
-
- xWidth = 3 + 2 * RANDOM.INT(10)
- yWidth = xWidth
- Centre = xWidth \ 2
- sWidth = RANDOM.INT(Centre)
-
- FOR Y = 0 TO Centre
- FOR X = 0 TO Y
- IF X + (Centre - Y) >= sWidth THEN
- Grid(Centre - X + 1, Y + 1) = Colour
- Grid(Centre + X + 1, Y + 1) = Colour
- Grid(Centre - X + 1, yWidth - Y) = Colour
- Grid(Centre + X + 1, yWidth - Y) = Colour
- END IF
- NEXT X
- NEXT Y
-
- CASE 4: ' Ball
-
- xWidth = 7 + 2 * RANDOM.INT(8)
- yWidth = xWidth
- Centre = 1 + xWidth \ 2
-
- FOR Y = 1 TO yWidth
- FOR X = 1 TO xWidth
- D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
- IF D < Centre THEN Grid(X, Y) = 150 + Colour * 2 + D * 3
- NEXT X
- NEXT Y
-
- CASE 5: ' Ball
-
-
- xWidth = 7 + 2 * RANDOM.INT(8)
- yWidth = xWidth
- Centre = 1 + xWidth \ 2
- sWidth = RANDOM.INT(xWidth)
-
- FOR Y = 1 TO yWidth
- FOR X = 1 TO xWidth
- D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
- IF D < Centre AND D >= sWidth THEN Grid(X, Y) = 150 + Colour * 2 + D * 3
- NEXT X
- NEXT Y
-
- END SELECT
-
- Img(Shape).xWidth = xWidth
- Img(Shape).yWidth = yWidth
-
- A$ = STRING$(xWidth * yWidth, nil)
-
- c = 1
- FOR Y = 1 TO yWidth
- FOR X = 1 TO xWidth
- MID$(A$, c, 1) = CHR$(Grid(X, Y))
- c = c + 1
- NEXT X
- NEXT Y
-
- Img(Shape).ImgData = A$
-
-
- NEXT Shape
-
- END SUB
-
- SUB PAGE.DEMO
-
- CONST MaxSprites = 64
-
- DIM Obj(MaxSprites) AS Sprite
- DIM LastX(MaxSprites, 1), LastY(MaxSprites, 1)
- DIM LastObjects(1)
-
- ScreenX = 360: ScreenY = 240
-
- IF SET.VGA.MODEX%(Mode320x200, ScreenX, ScreenY, 3) = 0 THEN
- ERROR.OUT "Unable to SET_VGA_MODEX" + STR$(Mode)
- END IF
-
- SET.ACTIVE.PAGE 0
-
- CLEAR.VGA.SCREEN c.BLACK
-
- PRINT.TEXT "This is a Test of the Following Functions:", 10, 9, c.bWHITE, c.BLACK
-
- DRAW.LINE 10, 18, 350, 18, c.YELLOW
- PRINT.TEXT "SET_ACTIVE_PAGE", 10, 20, c.bBLUE, c.BLACK
- PRINT.TEXT "SET_DISPLAY_PAGE", 10, 30, c.GREEN, c.BLACK
- PRINT.TEXT "SET_DAC_REGISTER", 10, 40, c.RED, c.BLACK
- PRINT.TEXT "CLEAR_VGA_SCREEN", 10, 50, c.CYAN, c.BLACK
-
- PRINT.TEXT "TDRAW_BITMAP", 10, 60, c.PURPLE, c.BLACK
- PRINT.TEXT "COPY_PAGE", 10, 70, c.GREEN, c.BLACK
- PRINT.TEXT "COPY_BITMAP", 10, 80, c.CYAN, c.BLACK
-
- PRINT.TEXT "GPRINTC", 10, 90, c.BLUE, c.BLACK
- PRINT.TEXT "TGPRINTC", 10, 100, c.GREEN, c.BLACK
- PRINT.TEXT "SET_WINDOW", 10, 110, c.RED, c.BLACK
-
- PRINT.TEXT "VIRTUAL SCREEN SIZES", 190, 20, c.bBLUE, c.BLACK
- PRINT.TEXT " SMOOTH SCROLLING", 190, 30, c.GREEN, c.BLACK
- PRINT.TEXT " SPRITE ANIMATION", 190, 40, c.CYAN, c.BLACK
- PRINT.TEXT " PAGE FLIPPING", 190, 50, c.RED, c.BLACK
- PRINT.TEXT " COLOR CYCLING", 190, 60, c.PURPLE, c.BLACK
-
-
- FOR X = 0 TO 60
- SET.DAC.REGISTER 50 + X, 3 + X, 0, 60 - X
- SET.DAC.REGISTER 150 + X, 3 + X, 0, 60 - X
- NEXT X
-
- c = 0: DC = 1
- FOR X = 0 TO ScreenX \ 2
- DRAW.LINE ScreenX \ 2 - 1, ScreenY \ 4, X, ScreenY - 1, c + 50
- DRAW.LINE ScreenX \ 2, ScreenY \ 4, ScreenX - X - 1, ScreenY - 1, c + 50
- c = c + DC
- IF c = 0 OR c = 60 THEN DC = -DC
- NEXT X
-
- TPRINT.TEXT "Press <ANY KEY> to Continue", 72, 190, c.bWHITE
- TPRINT.TEXT "< > = Faster < > = Slower", 72, 204, c.bGREEN
- TPRINT.TEXT "< > = Fewer Shapes < > = More Shapes", 32, 218, c.bCYAN
-
- TGPRINTC 43, 80, 204, c.YELLOW
- TGPRINTC 45, 200, 204, c.YELLOW
-
- TGPRINTC 25, 40, 218, c.YELLOW
- TGPRINTC 24, 200, 218, c.YELLOW
-
- COPY.PAGE 0, 1
- COPY.PAGE 0, 2
-
- FOR X = 1 TO MaxSprites
- DO
- Obj(X).XDir = RANDOM.INT(7) - 3
- Obj(X).YDir = RANDOM.INT(7) - 3
- LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
-
- Obj(X).Shape = X MOD MaxShapes
-
- SpriteX = Img(Obj(X).Shape).xWidth
- SpriteY = Img(Obj(X).Shape).yWidth
-
- Obj(X).Xpos = 1 + RANDOM.INT(ScreenX - SpriteX - 2)
- Obj(X).Ypos = 1 + RANDOM.INT(ScreenY - SpriteY - 2)
-
- LastX(X, 0) = Obj(X).Xpos
- LastX(X, 1) = Obj(X).Xpos
- LastY(X, 0) = Obj(X).Ypos
- LastY(X, 1) = Obj(X).Ypos
- NEXT X
-
- CurrentPage = 0
-
- 'View Shift...
-
- ViewX = 0
- ViewY = 0
- ViewMax = 3
- ViewCnt = 0
- ViewXD = 1
- ViewYD = 1
-
- SetColor = 3: SDir = 1
- PrevColor = 0: PDir = 1
-
- VisObjects = MaxSprites \ 2
- LastObjects(0) = 0
- LastObjects(1) = 0
-
- DRAW.LOOP:
-
-
- SET.ACTIVE.PAGE CurrentPage
-
- ' Erase Old Images
-
- FOR X = 1 TO LastObjects(CurrentPage)
-
- X1 = LastX(X, CurrentPage) AND &HFFFC
- Y1 = LastY(X, CurrentPage)
- X2 = ((LastX(X, CurrentPage) + Img(Obj(X).Shape).xWidth)) OR 3
- Y2 = Y1 + Img(Obj(X).Shape).yWidth - 1
-
- COPY.BITMAP 2, X1, Y1, X2, Y2, CurrentPage, X1, Y1
-
- NEXT X
-
- ' Draw new images
-
- FOR X = 1 TO VisObjects
-
- SpriteX = Img(Obj(X).Shape).xWidth
- SpriteY = Img(Obj(X).Shape).yWidth
-
- ' Move Sprite
-
- REDOX:
- NewX = Obj(X).Xpos + Obj(X).XDir
- IF NewX < 0 OR NewX + SpriteX > ScreenX THEN
- Obj(X).XDir = -Obj(X).XDir
- IF RANDOM.INT(20) = 1 THEN
- DO
- Obj(X).XDir = RANDOM.INT(7) - 3
- Obj(X).YDir = RANDOM.INT(7) - 3
- LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
- GOTO REDOX
- END IF
- END IF
- Obj(X).Xpos = Obj(X).Xpos + Obj(X).XDir
-
- REDOY:
- NewY = Obj(X).Ypos + Obj(X).YDir
- IF NewY < 0 OR NewY + SpriteY > ScreenY THEN
- Obj(X).YDir = -Obj(X).YDir
- IF RANDOM.INT(20) = 1 THEN
- DO
- Obj(X).XDir = RANDOM.INT(7) - 3
- Obj(X).YDir = RANDOM.INT(7) - 3
- LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
- GOTO REDOY
- END IF
- END IF
- Obj(X).Ypos = Obj(X).Ypos + Obj(X).YDir
-
- 'Draw Sprite
-
- TDRAW.BITMAP Img(Obj(X).Shape), Obj(X).Xpos, Obj(X).Ypos, SpriteX, SpriteY
-
- LastX(X, CurrentPage) = Obj(X).Xpos
- LastY(X, CurrentPage) = Obj(X).Ypos
-
- NEXT X
-
- LastObjects(CurrentPage) = VisObjects
-
- ' Pan Screen Back & Forth
-
- ViewCnt = ViewCnt + 1
- IF ViewCnt >= ViewMax THEN
- ViewX = ViewX + ViewXD
- IF ViewX = 0 OR ViewX = 39 THEN ViewXD = -ViewXD
- IF ViewXD < 0 THEN
- ViewY = ViewY + ViewYD
- IF ViewY = 0 OR ViewY = 39 THEN ViewYD = -ViewYD
- END IF
-
- SET.WINDOW CurrentPage, ViewX, ViewY
-
- ViewCnt = 0
- ELSE
- SET.DISPLAY.PAGE CurrentPage
- END IF
-
- ' Cycle Colors
-
- SET.DAC.REGISTER 50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
- SET.DAC.REGISTER 50 + SetColor, SetColor, 10, 63 - SetColor
-
- SET.DAC.REGISTER 150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
- SET.DAC.REGISTER 150 + SetColor, 63, 63, SetColor
-
- SetColor = SetColor + SDir
- IF SetColor = 60 OR SetColor = 0 THEN SDir = -SDir
-
- PrevColor = PrevColor + PDir
- IF PrevColor = 60 OR PrevColor = 0 THEN PDir = -PDir
-
- CurrentPage = 1 - CurrentPage
-
- Code = SCAN.KEYBOARD
-
- IF Code = False THEN GOTO DRAW.LOOP
-
- IF Code = KyPlus THEN
- IF ViewMax < 12 THEN ViewMax = ViewMax + 1
- GOTO DRAW.LOOP
- END IF
-
- IF Code = KyMinus THEN
- IF ViewMax > 1 THEN ViewMax = ViewMax - 1
- IF ViewCnt >= ViewMax THEN ViewCnt = 0
- GOTO DRAW.LOOP
- END IF
-
- IF Code = KyUp THEN
- IF VisObjects < MaxSprites THEN VisObjects = VisObjects + 1
- GOTO DRAW.LOOP
- END IF
-
- IF Code = KyDown THEN
- IF VisObjects > 1 THEN VisObjects = VisObjects - 1
- GOTO DRAW.LOOP
- END IF
-
-
- END SUB
-
- SUB PRINT.TEXT (Text$, Xpos, Ypos, ColorF, ColorB)
-
- IF LEN(Text$) = 0 THEN EXIT SUB
-
- PRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF, ColorB
-
-
- END SUB
-
- SUB TPRINT.TEXT (Text$, Xpos, Ypos, ColorF)
-
- IF LEN(Text$) = 0 THEN EXIT SUB
-
- TPRINT.STR SSEG(Text$), SADD(Text$), LEN(Text$), Xpos, Ypos, ColorF
-
- END SUB
-
-